package com.ly.algorithm.DataStructures.problem;

import java.util.LinkedList;

/**
 * @Classname DecodeString
 * @Description
 *
 * 给定一个经过编码的字符串，返回它解码后的字符串。
 *
 * 编码规则为: k[encoded_string]，表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
 *
 * 你可以认为输入字符串总是有效的；输入字符串中没有额外的空格，且输入的方括号总是符合格式要求的。
 *
 * 此外，你可以认为原始数据不包含数字，所有的数字只表示重复的次数 k ，例如不会出现像 3a 或 2[4] 的输入。
 *
 * 示例:
 *
 * s = "3[a]2[bc]", 返回 "aaabcbc".
 * s = "3[a2[c]]", 返回 "accaccacc".
 * s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef
 *
 * @Date 2020/5/28 9:11
 * @Author 冷心影翼
 */
public class DecodeString {

    public static void main(String[] args) {
        Solution394 solution394 = new Solution394();
        System.out.println(solution394.decodeString("10[a]"));
    }
}


class Solution394 {
    public String decodeString(String s) {
        LinkedList<Character> linkedList1 = new LinkedList<>();
        for(int i=0;i<s.length();i++) {
            if(s.charAt(i) == ']') {
                String str = "";

                while (true) {
                    Character character = linkedList1.removeFirst();
                    if(character != '[') {
                        str += character;
                    }else {
                        StringBuilder count = new StringBuilder("");
                        while ((linkedList1.peekFirst()+"").matches("[0-9]"))
                             count.append(linkedList1.removeFirst()+"");
                        count = new StringBuilder(count).reverse();
                        String temp = str;
                        for(int j=0;j<Integer.parseInt(count.toString())-1;j++) {
                            str += temp;
                        }
                        for(int k=str.length()-1;k>=0;k--) {
                            linkedList1.addFirst(str.charAt(k));
                        }
                        break;
                    }
                }
            }else {
                linkedList1.addFirst(s.charAt(i));
            }
        }
        String res = "";
        int t = linkedList1.size();
        for(int i=0;i<t;i++) {
            res += linkedList1.pollLast();
        }
        return res;
    }
}